package com.tianquan.miracle.postprocessor;

import jakarta.annotation.PostConstruct;

import java.lang.reflect.Method;

/**
 *@Author: tianquan
 *@date: 2024-12-02  11:19
 *@Description: 用于在 Bean 初始化前后进行处理
 */
public class PostConstructBeanPostProcessor implements BeanPostProcessor{

    /**
     * 在 Bean 初始化之前执行的方法
     * 该方法遍历 Bean 的所有方法，查找带有 PostConstruct 注解的方法，并将其执行
     *
     * @param bean 要处理的 Bean 实例
     * @param beanName Bean 的名称
     * @return 处理后的 Bean 实例
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        // 获取所有的方法
        Method[] declaredMethods = bean.getClass().getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            // 检查方法是否带有 PostConstruct 注解
            if (declaredMethod.isAnnotationPresent(PostConstruct.class)){
                // 设置方法可访问，以确保即使方法是私有的也能执行
                declaredMethod.setAccessible(true);
                try {
                    // 执行带有 PostConstruct 注解的方法
                    declaredMethod.invoke(bean);
                } catch (Exception e) {
                    // 如果方法执行出错，则打印错误栈信息
                    e.printStackTrace();
                }
            }
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean;
    }

}
